HAL CCB compute ECDSA signature using RNG with hardware key

Sequence diagram

HAL1

HAL2

@startuml
==Initialization==

participant "User application" as App
participant "HAL CCB Driver" as CCB

App -> CCB : HAL_CCB_Init()
activate CCB
note right : Initialize the CCB handle and associate an instance
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Blob creation ==
App -> CCB : HAL_CCB_ECDSA_GenerateWrapPrivateKey()
activate CCB
note right : Generate an RNG private key and create the ECDSA blob using a hardware key
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Blob usage ==
App -> CCB : HAL_CCB_ECDSA_Sign()
activate CCB
note right : Compute the signature parts r and s
CCB --> App : HAL_OK
deactivate CCB
note left : return

App -> CCB : HAL_CCB_ECDSA_ComputePublicKey()
activate CCB
note right : Compute public key coordinates x and y
CCB --> App : HAL_OK
deactivate CCB
note left : return

@enduml

@startuml
==Initialization==

participant "User application" as App
participant "HAL CCB Driver" as CCB

App -> CCB : HAL_CCB_Init()
activate CCB
note right : Initialize the CCB handle and associate an instance
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Blob creation ==

App -> CCB : HAL_CCB_ECDSA_HW_GenerateWrapPrivateKey()
activate CCB
note right : Generate an RNG private key and create the ECDSA blob using a hardware key
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Blob usage ==
App -> CCB : HAL_CCB_ECDSA_HW_Sign()
activate CCB
note right : Compute the signature (part r, part s)
CCB --> App : HAL_OK
deactivate CCB
note left : return
App -> CCB : HAL_CCB_ECDSA_HW_ComputePublicKey()
activate CCB
note right : Compute public key (coordinate x, coordinate y)
CCB --> App : HAL_OK
note left : return
deactivate CCB
@enduml

Code snippet

HAL1

HAL2

CCB_HandleTypeDef hccb;
CCB_WrappingKeyTypeDef wrappedKeyConf;
CCB_ECDSACurveParamTypeDef ECDSAparam;
CCB_ECDSAKeyBlobTypeDef ECDSAKeyBlob;
CCB_ECDSASignTypeDef Signature;
CCB_ECCMulPointTypeDef publickeyOut;
HAL_CCB_Init(&hccb);

wrappedKeyConf.WrappingKeyType         = HAL_CCB_USER_KEY_HW;
ECDSAKeyBlob.pIV                       = IV_Buffer;
ECDSAKeyBlob.pTag                      = TAG_Buffer;
ECDSAKeyBlob.pWrappedKey               = PrivateKey_encrypted_192;

ECDSAparam.primeOrderSizeByte          = ecdsa192_n_length;
ECDSAparam.modulusSizeByte             = ecdsa192_p_length;
ECDSAparam.coefSignA                   = ecdsa192_a_sign;
ECDSAparam.pAbsCoefA                   = ecdsa192_a_abs;
ECDSAparam.pCoefB                      = ecdsa192_b;
ECDSAparam.pModulus                    = ecdsa192_p;
ECDSAparam.pPrimeOrder                 = ecdsa192_n;
ECDSAparam.pPointX                     = ecdsa192_Gx;
ECDSAparam.pPointY                     = ecdsa192_Gy;

HAL_CCB_ECDSA_GenerateWrapPrivateKey(&hccb, &ECDSAparam,
                                     &wrappedKeyConf, &ECDSAKeyBlob);

Signature.pSSign                       = ECDSASout_192;
Signature.pRSign                       = ECDSARout_192;
HAL_CCB_ECDSA_Sign(&hccb, &ECDSAparam, &wrappedKeyConf,
                   &ECDSAKeyBlob, ECDSAHash_192, &Signature);

publickeyOut.pPointX                   = PublicKeyXout_192;
publickeyOut.pPointY                   = PublicKeyYout_192;
HAL_CCB_ECDSA_ComputePublicKey(&hccb, &ECDSAparam, &wrappedKeyConf,
                               &ECDSAKeyBlob,
                               &publickeyOut);
hal_ccb_handle_t hccb;
hal_ccb_wrapping_sw_key_context_t wrappedKeyConf;
hal_ccb_ecdsa_curve_param_t ECDSAparam;
hal_ccb_ecdsa_key_blob_t ECDSAKeyBlob;
hal_ccb_ecdsa_sign_t Signature;
hal_ccb_ecc_point_t publickeyOut;
HAL_CCB_Init(&hccb, HAL_CCB);

ECDSAKeyBlob.p_iv                            = IV_Buffer;
ECDSAKeyBlob.p_tag                           = TAG_Buffer;
ECDSAKeyBlob.p_wrapped_key                   = PrivateKey_encrypted_192;

ECDSAparam.prime_order_size_byte             = ecdsa192_n_length;
ECDSAparam.modulus_size_byte                 = ecdsa192_p_length;
ECDSAparam.coef_sign_a                       = ecdsa192_a_sign;
ECDSAparam.p_abs_coef_a                      = ecdsa192_a_abs;
ECDSAparam.p_coef_b                          = ecdsa192_b;
ECDSAparam.p_modulus                         = ecdsa192_p;
ECDSAparam.p_prime_order                     = ecdsa192_n;
ECDSAparam.p_point_x                         = ecdsa192_Gx;
ECDSAparam.p_point_y                         = ecdsa192_Gy;
ECDSAparam.ecdsa_pool_buffer.p_buff          = ccb_pool_buffer;
ECDSAparam.ecdsa_pool_buffer.buff_size_byte  = HAL_CCB_ECDSA_CALC_BUFFER_SIZE(ecdsa192_p_length);
HAL_CCB_ECDSA_HW_GenerateWrapPrivateKey(&hccb, &ECDSAparam,
                                        HAL_CCB_KEY_HW, &ECDSAKeyBlob);

Signature.p_s_sign                           = ECDSASout_192;
Signature.p_r_sign                           = ECDSARout_192;
HAL_CCB_ECDSA_HW_Sign(&hccb, &ECDSAparam, HAL_CCB_KEY_HW,
                      &ECDSAKeyBlob, ECDSAHash_192, 24, &Signature);

publickeyOut.p_point_x                       = PublicKeyXout_192;
publickeyOut.p_point_y                       = PublicKeyYout_192;
HAL_CCB_ECDSA_HW_ComputePublicKey(&hccb, &ECDSAparam,
                                  HAL_CCB_KEY_HW,
                                  &ECDSAKeyBlob, &publickeyOut);